package com.motu.monstercity.server.login.iap;

import com.motu.monstercity.module.common.iap.Iap;
import com.motu.monstercity.module.common.iap.IapGift;
import com.motu.monstercity.module.common.iap.IapProduct;
import com.motu.vertx.module.utility.base.ServerConfig;
import com.motu.vertx.module.utility.main.MainService;
import com.motu.vertx.module.utility.mysql.MysqlClient;
import com.motu.vertx.module.utility.mysql.MysqlTool;
import com.motu.vertx.module.utility.toolset.TimeUtils;
import com.motu.vertx.module.utility.toolset.Tool;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.kafka.client.producer.KafkaProducer;
import io.vertx.kafka.client.producer.KafkaProducerRecord;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;

public class LoginIapManager {
    private final static Logger logger = LoggerFactory.getLogger(LoginIapManager.class);

    private static ConcurrentHashMap<Integer, Iap> iapMap = new ConcurrentHashMap<>();
    private static ConcurrentHashMap<Integer, IapGift> iapGiftMap = new ConcurrentHashMap<>();// iap礼包
    private static ConcurrentHashMap<String, IapProduct> iapProductMap = new ConcurrentHashMap<>();

    public static KafkaProducer<String, String> producer;//充值成功写入kafka

    public static void init(List<Future> futures) {
        initIapKafka();
        futures.add(initIap());
        futures.add(initIapProduct());
        futures.add(initIapGift());
    }

    public static void initIapKafka() {
        String kafkaAddress = ServerConfig.getAppConfig().getString("game-iap-kafka-address");
        if (Tool.isEmpty(kafkaAddress)) {
            logger.error("game-iap-kafka-address is null !!!");
            return;
        }

        logger.info("create iap kafka producer address:" + kafkaAddress);

        Properties config = new Properties();
        config.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaAddress);
        config.put("key.serializer", StringSerializer.class);
        config.put("value.serializer", StringSerializer.class);
        config.put("acks", "1");

        // 创建一个Kafka Producer
        producer = KafkaProducer.create(MainService.getVertx(), config);
    }

    /***
     * 初始化iap列表
     * @return
     */
    public static Future<Void> initIap() {
        Promise promise = Promise.promise();
        String sql = "select * from iap;";
        MysqlTool.queryJsonArrayFromDb(MysqlClient.getCommonPool(), sql, new JsonArray(), res -> {
            if (res.succeeded()) {
                ConcurrentHashMap<Integer, Iap> tmp = new ConcurrentHashMap<>();
                JsonArray list = res.result();
                logger.info("initIap size:" + list.size());
                for (int i = 0; i < list.size(); i++) {
                    Iap iap = new Iap(list.getJsonObject(i));
                    tmp.put(iap.getId(), iap);
                }
                iapMap.clear();
                iapMap = tmp;
                promise.complete();
            } else {
                logger.error(res.cause().getMessage());
                promise.fail(res.cause());
            }
        });
        return promise.future();
    }

    /****
     * 根据iapid获取iap项
     * @param key iapid
     * @return
     */
    public static Iap getIap(int key) {
        if (iapMap.containsKey(key)) {
            return iapMap.get(key);
        } else {
            logger.error("getIap error key:" + key);
            return null;
        }
    }

    /***
     * 初始化iapProduct列表
     * @return
     */
    public static Future<Void> initIapProduct() {
        logger.info("initIapProduct !!!");
        Promise promise = Promise.promise();
        String sql = "select * from iap_product;";
        MysqlTool.queryJsonArrayFromDb(MysqlClient.getCommonPool(), sql, new JsonArray(), res -> {
            if (res.succeeded()) {
                ConcurrentHashMap<String, IapProduct> tmp = new ConcurrentHashMap<>();
                JsonArray list = res.result();
                logger.info("initIapProduct size:" + list.size());
                for (int i = 0; i < list.size(); i++) {
                    IapProduct iapproduct = new IapProduct(list.getJsonObject(i));
                    tmp.put(iapproduct.getProductId(), iapproduct);
                }
                iapProductMap.clear();
                iapProductMap = tmp;
                promise.complete();
            } else {
                logger.error("initIapproduct error:" + res.cause().getMessage());
                promise.fail(res.cause());
            }
        });
        return promise.future();
    }

    /****
     * 根据key获取iapProduct项
     * @param key iapProductId
     * @return
     */
    public static IapProduct getIapProduct(String key) {
        if (iapProductMap.containsKey(key)) {
            return iapProductMap.get(key);
        } else {
            logger.error("getIapProduct error key:" + key);
            return null;
        }
    }

    public static List<IapProduct> getIapProductByPackage(String packageName) {
        List<IapProduct> list = new ArrayList<>();
        for (IapProduct iapProduct : iapProductMap.values()) {
            if (iapProduct.getPackageName().equalsIgnoreCase(packageName)) {
                list.add(iapProduct);
            }
        }
        return list;
    }

    public static Future<Void> initIapGift() {
        Promise promise = Promise.promise();
        String sql = "select * from iap_gift;";
        MysqlTool.queryJsonArrayFromDb(MysqlClient.getCommonPool(), sql, new JsonArray(), res -> {
            if (res.succeeded()) {
                ConcurrentHashMap<Integer, IapGift> tmp = new ConcurrentHashMap<>();
                JsonArray list = res.result();
                logger.info("initIapGift size:" + list.size());
                for (int i = 0; i < list.size(); i++) {
                    IapGift iap = new IapGift(list.getJsonObject(i));
                    tmp.put(iap.getId(), iap);
                }
                iapGiftMap = tmp;
                promise.complete();
            } else {
                logger.error(res.cause().getMessage());
                promise.fail(res.cause());
            }
        });
        return promise.future();
    }

    public static IapGift getIapGift(int key) {
        if (iapGiftMap.containsKey(key)) {
            return iapGiftMap.get(key);
        } else {
            logger.error("getIapGift error key:" + key);
            return null;
        }
    }

    public static ConcurrentHashMap<Integer, IapGift> getIapGiftMap() {
        return iapGiftMap;
    }

    /***
     * 订单入库（iap_order表）
     */
    public static Future<Object> saveIapOrder(long userId, int platform, int iapGiftId, double money, int diamond,
                                              String productId, String orderId, String transInfo) {
        Promise<Object> fut = Promise.promise();
        String sql = "INSERT INTO iap_order(user_id,platform,iap_gift_id,money,diamond,product_id,order_id,trans_info,add_time)" +
                " VALUES(?,?,?,?,?,?,?,?,?);";
        JsonArray params = new JsonArray();
        params.add(userId);
        params.add(platform);
        params.add(iapGiftId);
        params.add(money);
        params.add(diamond);
        params.add(productId);
        params.add(orderId);
        params.add(transInfo);
        params.add(TimeUtils.getCurTime());
        MysqlTool.updateToDb(MysqlClient.getGamePool(), sql, params, handler -> {
            if (handler.succeeded()) {
                fut.complete(handler.result());
            } else {
                fut.fail(handler.cause().getMessage());
            }
        });
        return fut.future();
    }

//    /***
//     * 处理get类型回调
//     * @param routingContext
//     */
//    public static void doChargeGet(RoutingContext routingContext, WebClient webClient) {
//        String path = routingContext.request().path();
//        logger.info("^^^^^ doGet path:" + path);
//        if (path.contains("/alipayweb/pay")) {//支付宝h5下单
//            dealAlipayWebPay(routingContext);
//        } else if (path.contains("/wxpayweb/pay")) {//微信h5下单
//            dealWxpayPay(routingContext, webClient);
//        } else if (path.contains("/alipay/pay")) {//支付宝下单
//            dealAlipayPay(routingContext);
//        } else if (path.contains("/wxpay/pay")) {//微信下单
//            dealWxpayPay(routingContext, webClient);
//        } else if (path.contains("/alipayweb/receive")) {//支付宝回调
//            dealCallBackAlipay(routingContext);
//        } else if (path.contains("/yehuo/receive")) {//野火回调
////			dealCallBackYehuo(routingContext,webClient);
//        } else if (path.contains("/9377/receive")) {//9377回调
//            dealCallBack9377(routingContext);
//        } else if (path.contains("/muyou/receive")) {//沐游回调
//            dealCallBackMuyouGet(routingContext);
//        } else if (path.contains("/muyou/resvervation/receive")) {//沐游gp预约礼包回调
//            dealCallBackMuyouResvervationGet(routingContext);
//        } else if (path.contains("/muyou/weborder/ios/receive")) {//沐游ios网页下单
//            dealCallBackMuyouWeborderGet(routingContext, "IOS");
//        } else if (path.contains("/muyou/weborder/android/receive")) {//沐游安卓网页下单
//            dealCallBackMuyouWeborderGet(routingContext, "ANDROID");
//        } else if (path.contains("/muyou/webresvervegift/ios/receive")) {//沐游官网预约礼包ios发货回调
//            dealCallBackMuyouWebresvervegiftGet(routingContext, "IOS");
//        } else if (path.contains("/muyou/webresvervegift/android/receive")) {//沐游官网预约礼包android发货回调
//            dealCallBackMuyouWebresvervegiftGet(routingContext, "ANDROID");
//        } else if (path.contains("/ujoy/receive")) {// ujoy充值回调
//            dealCallBackUjoyGet(routingContext);
//        } else if (path.contains("/test/receive")) {
//            if (ServerConfig.isDebugServer() || ServerConfig.isReviewServer()) {//测试服和评审服再启用模拟充值回调接口
//                long userId = Long.parseLong(routingContext.request().getParam("uid"));
//                int platform = Integer.parseInt(routingContext.request().getParam("platform"));
//                int iapGiftId = Integer.parseInt(routingContext.request().getParam("iapid"));
//                String orderId = routingContext.request().getParam("orderid");
//                IapGift iapGift = getIapGift(iapGiftId);
//                Iap iap = getIap(iapGift.getIapId());
//                logger.info("*** doGet debug charge userId:" + userId + " orderId:" + orderId);
//                Future<Object> fut = saveIapOrder(userId, platform, iapGiftId, iap.getBiMoney(), iapGift.getDiamond(), "", orderId, "");
//                fut.onComplete(handler -> {
//                    if (handler.succeeded()) {
//                        noticeGameReceiveIap(userId, orderId, iapGiftId);
//                        routingContext.response().end("success");
//                    } else {
//                        logger.error("debug charge error :" + handler.cause().getMessage());
//                        routingContext.response().end(handler.cause().getMessage());
//                    }
//                });
//            } else {
//                routingContext.response().end("not debug server");
//            }
//        } else {
//            routingContext.response().end("error path:" + path);
//        }
//    }
//
//    /***
//     * 处理支付宝app版下单请求
//     * @param routingContext
//     */
//    private static void dealAlipayPay(RoutingContext routingContext) {
//        try {
//            HttpServerRequest request = routingContext.request();
//            // 商户订单号，商户网站订单系统中唯一订单号，必填
//            String out_trade_no = request.getParam("orderid");
//            // 订单名称，必填
//            String subject = request.getParam("subject");
////			System.out.println(subject);
//            // 付款金额，必填
//            int iapGiftId = Integer.parseInt(request.getParam("iapid"));
//            IapGift iapGift = getIapGift(iapGiftId);
//            Iap iap = getIap(iapGift.getIapId());
//            String total_amount = "" + iap.getMoney();
//            ;
//            // 商品描述，可空
//            String body = request.getParam("body");
//            // 透传参数
//            String passback_params = java.net.URLEncoder.encode(request.getParam("params"));
//            // 付款金额，必填
//
//
//            logger.info("########## out_trade_no:" + out_trade_no + " subject:" + subject + " total_amount:" + total_amount + " body:" + body + " passback_params:" + passback_params);
//            // 超时时间 可空
//            String timeout_express = "2m";
//            // 销售产品码 必填
//            String product_code = "QUICK_MSECURITY_PAY";
//            /**********************/
//            // SDK 公共请求类，包含公共请求参数，以及封装了签名与验签，开发者无需关注签名与验签
//            //调用RSA签名方式
//            AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, ServerParam.ALIPAY_APPID, ServerParam.ALIPAY_RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, ServerParam.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
//            AlipayTradeAppPayRequest alipay_request = new AlipayTradeAppPayRequest();
//
//            // 封装请求支付信息
//            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
//            model.setBody(body);
//            model.setSubject(subject);
//            model.setOutTradeNo(out_trade_no);
//            model.setTimeoutExpress(timeout_express);
//            model.setTotalAmount(total_amount);
//            model.setProductCode(product_code);
//            model.setPassbackParams(passback_params);//设置透传参数
//            alipay_request.setBizModel(model);
//            // 设置异步通知地址
//            alipay_request.setNotifyUrl(ServerParam.ALIPAY_NOTIFY_URL);
//            try {
//                //这里和普通的接口调用不同，使用的是sdkExecute
//                AlipayTradeAppPayResponse alipay_response = client.sdkExecute(alipay_request);
////		        Map<String,Object> retMap = Tool.getParamsMap(alipay_response.getBody());
////		        JsonObject obj = new JsonObject(retMap);
//                logger.info("dealAlipayPay body:" + alipay_response.getBody());//就是orderString 可以直接给客户端请求，无需再做处理。
////		        logger.info("dealAlipayPay json:"+obj.toString());
//                routingContext.response().end(alipay_response.getBody());
//            } catch (AlipayApiException e) {
//                e.printStackTrace();
//            }
//        } catch (Exception e) {
//            logger.error(e.getCause().getMessage());
//            e.printStackTrace();
//        }
//    }
//
//    /***
//     * 处理支付宝H5版下单请求
//     * @param routingContext
//     */
//    private static void dealAlipayWebPay(RoutingContext routingContext) {
//        try {
//            HttpServerRequest request = routingContext.request();
//            // 商户订单号，商户网站订单系统中唯一订单号，必填
//            String out_trade_no = request.getParam("orderid");
//            // 订单名称，必填
//            String subject = request.getParam("subject");
//            System.out.println(subject);
//            // 付款金额，必填
//            int iapGiftId = Integer.parseInt(request.getParam("iapid"));
//            IapGift iapGift = getIapGift(iapGiftId);
//            Iap iap = getIap(iapGift.getIapId());
//            String total_amount = "" + iap.getMoney();
//            ;
//            // 商品描述，可空
//            String body = request.getParam("body");
//            // 透传参数
//            String passback_params = request.getParam("params");
//            // 付款金额，必填
//
//
//            logger.info("########## out_trade_no:" + out_trade_no + " subject:" + subject + " total_amount:" + total_amount + " body:" + body + " passback_params:" + passback_params);
//            // 超时时间 可空
//            String timeout_express = "2m";
//            // 销售产品码 必填
//            String product_code = "QUICK_WAP_PAY";
//            /**********************/
//            // SDK 公共请求类，包含公共请求参数，以及封装了签名与验签，开发者无需关注签名与验签
//            //调用RSA签名方式
//            AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, ServerParam.ALIPAY_APPID, ServerParam.ALIPAY_RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, ServerParam.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
//            AlipayTradeWapPayRequest alipay_request = new AlipayTradeWapPayRequest();
//
//            // 封装请求支付信息
//            AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
//            model.setBody(body);
//            model.setSubject(subject);
//            model.setOutTradeNo(out_trade_no);
//            model.setTimeoutExpress(timeout_express);
//            model.setTotalAmount(total_amount);
//            model.setProductCode(product_code);
//            model.setPassbackParams(passback_params);//设置透传参数
//            alipay_request.setBizModel(model);
//            // 设置异步通知地址
//            alipay_request.setNotifyUrl(ServerParam.ALIPAY_NOTIFY_URL);
//            // 设置同步地址
//            String return_url = ServerParam.ALIPAY_RETURN_URL;
//            String myapp = request.getParam("myapp");
//            if (myapp != null && !myapp.isEmpty()) {
//                return_url += "?myapp=" + myapp;
//            }
//            alipay_request.setReturnUrl(return_url);
//
//            // form表单生产
//            String form = "";
//            try {
//                // 调用SDK生成表单
//                form = client.pageExecute(alipay_request).getBody();
//                routingContext.response().putHeader("content-type", "text/html;charset=" + AlipayConfig.CHARSET);
//                logger.info("##### dealAlipayWebPay form:" + form);
//                routingContext.response().end(form);//直接将完整的表单html输出到页面
//            } catch (AlipayApiException e) {
//                logger.error(e.getCause().getMessage());
//                e.printStackTrace();
//            }
//        } catch (Exception e) {
//            logger.error(e.getCause().getMessage());
//            e.printStackTrace();
//        }
//    }
//
//    /***
//     * 通知游戏服收到充值回调并已入库到iaporder表
//     */
//    public static void noticeGameReceiveIap(long userId, String orderId, int iapGiftId) {
//        JsonObject message = new JsonObject();
//        message.put("user_id", userId);
//        JsonObject obj = new JsonObject();
//        obj.put("order_id", orderId);
//        obj.put("iap_gift_id", iapGiftId);
//        message.put("obj", obj);
//        String ebName = Constant.getEventBusName(MainVerticle.getLocalName(), Constant.EVENT_BUS_GAME_IAP);
//        EventBus eventBus = MainVerticle.instance.vertxInstance.eventBus();
//        eventBus.request(ebName, message, ar -> {
//            if (ar.succeeded()) {
//                JsonObject recData = (JsonObject) ar.result().body();
//                if (recData.containsKey("retry")) {
//                    noticeGameReceiveIap(userId, orderId, iapGiftId);
//                    ;//递归重发
//                    logger.info("-------!!!!!!!------- retry  noticeGameReceiveIap userId:" + userId + " orderId:" + orderId + " iapGiftId:" + iapGiftId);
//                } else if (recData.containsKey("error")) {
//                    logger.info("noticeGameReceiveIap faild userId:" + userId + " orderId:" + orderId + " iapGiftId:" + iapGiftId);
//                } else {
//                    //处理成功
//                    logger.info("noticeGameReceiveIap userId:" + userId + " orderId:" + orderId + " iapGiftId:" + iapGiftId);
//                }
//            } else {
//                logger.info("eventBus.send failed:" + ar.cause().getMessage());
//                noticeGameReceiveIap(userId, orderId, iapGiftId);
//                ;//碰到服务端重启，重新发送
//            }
//        });
//    }
//
//    /***
//     * 处理post类型回调
//     * @param routingContext
//     */
//    public static void doChargePost(RoutingContext routingContext) {
//        String path = routingContext.request().path();
//        //		logger.info("^^^^^ doPost path:"+path);
//        if (path.contains("/alipayweb/receive")) {//支付宝回调
//            dealCallBackAlipay(routingContext);
//        } else if (path.contains("/wxpayweb/receive")) {//微信回调
//            dealCallBackWxpay(routingContext);
//        } else if (path.contains("/alipay/receive")) {//支付宝回调
//            dealCallBackAlipay(routingContext);
//        } else if (path.contains("/wxpay/receive")) {//微信回调
//            dealCallBackWxpay(routingContext);
//        } else if (path.contains("/changmeng/receive")) {//畅梦回调
//            dealCallBackChangemeng(routingContext);
//        } else if (path.contains("/muyou/receive")) {//沐游回调
//            dealCallBackMuyouPost(routingContext);
//        } else if (path.contains("/muyou/resvervation/receive")) {//沐游gp预约礼包回调
//            dealCallBackMuyouResvervationPost(routingContext);
//        } else if (path.contains("/muyou/weborder/ios/receive")) {//沐游ios网页下单
//            dealCallBackMuyouWeborderPost(routingContext, "IOS");
//        } else if (path.contains("/muyou/weborder/android/receive")) {//沐游安卓网页下单
//            dealCallBackMuyouWeborderPost(routingContext, "ANDROID");
//        } else if (path.contains("/muyou/webresvervegift/ios/receive")) {//沐游官网预约礼包ios发货回调
//            dealCallBackMuyouWebresvervegiftPost(routingContext, "IOS");
//        } else if (path.contains("/muyou/webresvervegift/android/receive")) {//沐游官网预约礼包android发货回调
//            dealCallBackMuyouWebresvervegiftPost(routingContext, "ANDROID");
//        }else if(path.contains("/client/log")){// 记录客户端充值日志
//            dealChargeClientLog(routingContext);
//        } else if (path.contains("/ujoy/receive")) {//ujoy回调
//            dealCallBackUjoyPost(routingContext);
//        }
//    }
//
//    /***
//     * 处理支付宝回调
//     * @param routingContext
//     */
//    private static void dealCallBackAlipay(RoutingContext routingContext) {
//        logger.info("dealCallBackAlipayWeb !!!");
//
//        routingContext.request().bodyHandler(res -> {
//            try {
//                //获取支付宝POST过来反馈信息
//                JsonObject paramsObj = new JsonObject();
//                Map<String, String> params = getParamsMap(res.toString(), paramsObj);
//
//
//                logger.info("#### dealCallBackAlipay receive:" + paramsObj.toString());
//                //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
//                //商户订单号
//
//                String out_trade_no = params.get("out_trade_no");
//                //支付宝交易号
//
//                String trade_no = params.get("trade_no");
//
//                //交易状态
//                String trade_status = params.get("trade_status");
//                logger.info("#### dealCallBackAlipay out_trade_no:" + out_trade_no + " trade_no:" + trade_no + " trade_status:" + trade_status);
//                //获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
//                //计算得出通知验证结果
//                //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
//                boolean verify_result = AlipaySignature.rsaCheckV1(params, ServerParam.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");
//
//                if (verify_result) {//验证成功
//
//                    logger.info("#### dealCallBackAlipay verify_result ok!!!!!!!!!!!!!");
//                    //////////////////////////////////////////////////////////////////////////////////////////
//                    //请在这里加上商户的业务逻辑程序代码
//
//                    //——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
//
//                    if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {
//                        //						logger.info("#### dealCallBackAlipay 1111");
//                        //判断该笔订单是否在商户网站中已经做过处理
//                        //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
//                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//                        //如果有做过处理，不执行商户的业务程序
//
//                        //注意：
//                        //如果签约的是可退款协议，退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
//                        //如果没有签约可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。
//                        //				} else if (trade_status.equals("TRADE_SUCCESS")){
//                        //判断该笔订单是否在商户网站中已经做过处理
//                        //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
//                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//                        //如果有做过处理，不执行商户的业务程序
//
//                        //注意：
//                        //如果签约的是可退款协议，那么付款完成后，支付宝系统发送该交易状态通知。
//                        String orderId = out_trade_no;
//
//                        String passbackParams = params.get("passback_params");
//                        String tmp[] = passbackParams.split("_");
////						long dbid = Long.parseLong(orderId);//iapclick表中的id
//                        long userId = Long.parseLong(tmp[0]);
//                        int platform = Integer.parseInt(tmp[1]);
//                        int iapGiftId = Integer.parseInt(tmp[2]);
//                        double money = Double.parseDouble(params.get("total_amount"));
//                        logger.info("#### dealCallBackAlipay userid:" + userId + " platform:" + platform + " iapGiftId:" + iapGiftId + " money:" + money);
//                        String transInfo = trade_no;
//                        IapGift iapGift = getIapGift(iapGiftId);
//                        if (iapGift == null) {
//                            Iap iap = getIap(iapGift.getIapId());
//                            if (iap != null) {
//                                if (!MainVerticle.isDebugServer() && money != iap.getMoney()) {
//                                    logger.error("######dealCallBackAlipay error money:" + money + " iap.getMoney:" + iap.getMoney() + " userId:" + userId);
//                                    updateIapClick(userId, orderId, 102, paramsObj.toString());//金额不对
//                                    routingContext.response().end("success");
//                                    return;
//                                }
//
//                                Future<Object> fut = saveIapOrder(userId, platform, iapGiftId, iap.getMoney(), iapGift.getDiamond(), "", orderId, transInfo);
//                                fut.onComplete(handler -> {
//                                    if (handler.succeeded()) {
//                                        noticeGameReceiveIap(userId, orderId, iapGiftId);
//                                        routingContext.response().end("success");
//                                        updateIapClick(userId, orderId, 1, paramsObj.toString());//校验成功
//                                    } else {
//                                        routingContext.response().end("success");//可能重复订单了
//                                    }
//                                });
//                            } else {
//                                logger.error("########dealCallBackAlipay error iapId:" + iapGift.getIapId() + " userId:" + userId);
//                                updateIapClick(userId, orderId, 101, paramsObj.toString());//iapid不存在
//                                routingContext.response().end("success");
//                            }
//                        } else {
//                            logger.error("########dealCallBackAlipay error iapGiftId:" + iapGiftId + " userId:" + userId);
//                            updateIapClick(userId, orderId, 101, paramsObj.toString());//iapid不存在
//                            routingContext.response().end("success");
//                        }
//                    } else {
//                        //校验失败，忽略
//                        routingContext.response().end();
//                    }
//
//                    //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
//                    //				routingContext.response().end("success");
//                    //				out.println("success");	//请不要修改或删除
//
//                    //////////////////////////////////////////////////////////////////////////////////////////
//                } else {//验证失败
//                    logger.error("#### dealCallBackAlipay verify_result fail!!!!!!!!!!!!!");
//                    routingContext.response().end("fail");
//                }
//            } catch (Exception e) {
//                logger.error(e.getMessage());
//                e.printStackTrace();
//            }
//        });
//
//
//    }
//
//    /***
//     * 处理微信支付下单请求
//     * @param routingContext
//     */
//    private static void dealWxpayPay(RoutingContext routingContext, WebClient webClient) {
//        try {
//            HttpServerRequest request = routingContext.request();
//            int iapGiftId = Integer.parseInt(request.getParam("iapid"));
//            IapGift iapGift = getIapGift(iapGiftId);
//            Iap iap = getIap(iapGift.getIapId());
//            String appId = request.getParam("appid");
//            String orderId = request.getParam("orderid");
//            String body = request.getParam("body");
//            String attach = request.getParam("attach");
//            String trade_type = "APP";
//            if (request.params().contains("trade_type")) {
//                trade_type = request.getParam("trade_type");
//            }
//            String mch_id = ServerParam.WXPAY_MCHID;
//            if (request.params().contains("mch_id")) {
//                mch_id = request.getParam("mch_id");
//            }
//
//            String nonce_str = Tool.getRandomPassword();
//            Document document = DocumentHelper.createDocument();//由DocumentHelper得到一个空的Document
//            document.setXMLEncoding("utf-8");//设置xml头条的Encoding
//            Element root = document.addElement("xml");
//            root.addElement("appid").addText(appId);
//            root.addElement("mch_id").addText(mch_id);
//            root.addElement("nonce_str").addText(nonce_str);
//            root.addElement("body").addText(body);
//            root.addElement("out_trade_no").addText(orderId);
//            root.addElement("total_fee").addText("" + Tool.rint(iap.getMoney() * 100));
//            String ip = BaseWebHandler.getClientIp(routingContext);//"106.75.133.181";
//            //			root.addElement("spbill_create_ip").addText(BaseWebHandler.getClientIp(routingContext));
//            root.addElement("spbill_create_ip").addText(ip);
//            root.addElement("notify_url").addText(ServerParam.WXPAY_NOTIFY_URL);
//            root.addElement("trade_type").addText(trade_type);
//            root.addElement("attach").addText(attach);
//            Map<String, String> params = new HashMap<String, String>();
//            for (Iterator iter = root.elementIterator(); iter.hasNext(); ) {
//                Element e = (Element) iter.next();
//                String name = e.getName();
//                String valueStr = e.getStringValue();
//                params.put(name, valueStr);
//            }
//            String appkey = ServerParam.getWxpayAppkey(appId);
//            MainVerticle.logger.info("###dealWxpayPay appkey = " + appkey + " appId = " + appId + " mch_id = " + mch_id);
//            if (appkey == null) {
////				MainVerticle.logger.info("###dealWxpayPay appkey is null appId = " + appId);
//                routingContext.response().end("error appId:" + appId);
//                return;
//            }
//            String stringA = AlipaySignature.getSignContent(params);//调用支付宝的参数排序拼接函数，跟微信规则一样，可通用
//            String stringSignTemp = stringA + "&key=" + appkey; //注：key为商户平台设置的密钥key
//            MainVerticle.logger.info("###dealWxpayPay stringSignTemp = " + stringSignTemp);
//            String sign = Tool.md5encrypt32(stringSignTemp).toUpperCase();//"9A0A8659F005D6984697E2CA0A9CF3B7" //注：MD5签名方式
//            root.addElement("sign").addText(sign);
////			logger.info("#### dealWxpayWebPay:"+document.asXML());
//
//            //			String ret = postDownloadJson(WxpayConfig.PAY_URL, document.asXML());
//            //			logger.info("#### dealWxpayWebPay ret:"+ret);
//            //			Document document2 = DocumentHelper.parseText(ret);
//            //			Element root2 = document2.getRootElement();
//            //			String return_code = root2.elementText("return_code");
//            //			String result_code = root2.elementText("result_code");
//            //			if(return_code.equals("SUCCESS") && result_code.equals("SUCCESS")){
//            //				String mweb_url = root2.elementText("mweb_url");
//            //				String ref = routingContext.request().getHeader("Referer");
//            //				logger.info("#### ref :"+ref);
//            //				if(ref == null || ref.isEmpty())
//            //					routingContext.request().headers().add("Referer", "http://king.more2.cn");
//            //
//            //				logger.info("##### ref2 :"+routingContext.request().getHeader("Referer"));
//            //				doRedirect(routingContext.response(),mweb_url);
//            //			}
//            //			InputStream inputStream = conn.getInputStream();
//            String trade_type2 = trade_type;
//            String mch_id2 = mch_id;
//            //			WebClient webClient = WebClient.create(MainVerticle.instance.vertxInstance);
//            Buffer buffer = Buffer.buffer(document.asXML());
//            webClient.postAbs(WxpayConfig.PAY_URL).sendBuffer(buffer, res -> {
//                if (res.succeeded()) {
//
//                    HttpResponse<Buffer> response = res.result();
//                    String resStr = response.bodyAsString();
//                    logger.info("#### resStr:" + resStr);
//                    try {
//                        Document document2 = DocumentHelper.parseText(resStr);
//                        Element root2 = document2.getRootElement();
//                        String return_code = root2.elementText("return_code");
//                        String result_code = root2.elementText("result_code");
//                        if (return_code.equals("SUCCESS") && result_code.equals("SUCCESS")) {
//                            if (trade_type2.equalsIgnoreCase("MWEB")) {
//                                String mweb_url = root2.elementText("mweb_url");
//                                String myapp = request.getParam("myapp");
//                                String return_url = MainVerticle.instance.appConfig.getString("wxpay-web-return-url");
//                                if (myapp != null && !myapp.isEmpty()) {
//                                    return_url += "?myapp=" + myapp;
//                                }
//                                String redirect_url = java.net.URLEncoder.encode(return_url);
//                                doRedirect(routingContext.response(), mweb_url + "&redirect_url=" + redirect_url);//跟支付宝通用一个html
//                            } else {
//                                String prepay_id = root2.elementText("prepay_id");
//                                String nonce_str2 = root2.elementText("nonce_str");
//                                String timestamp = "" + TimeUtils.getCurTime();
//                                Map<String, String> params2 = new HashMap<String, String>();
//                                params2.put("appid", appId);
//                                params2.put("partnerid", mch_id2);
//                                params2.put("prepayid", prepay_id);
//                                params2.put("package", "Sign=WXPay");
//                                params2.put("noncestr", nonce_str2);
//                                params2.put("timestamp", timestamp);
//
//                                String stringA2 = AlipaySignature.getSignContent(params2);//调用支付宝的参数排序拼接函数，跟微信规则一样，可通用
//                                String stringSignTemp2 = stringA2 + "&key=" + appkey; //注：key为商户平台设置的密钥key
//                                String sign2 = Tool.md5encrypt32(stringSignTemp2).toUpperCase();//"9A0A8659F005D6984697E2CA0A9CF3B7" //注：MD5签名方式
//
//                                JsonObject resObj = new JsonObject();
//                                resObj.put("prepay_id", prepay_id);
//                                resObj.put("noncestr", nonce_str2);
//                                resObj.put("timestamp", timestamp);
//                                resObj.put("sign", sign2);
//                                routingContext.response().end(resObj.toString());
//                            }
//                        }
//                    } catch (Exception e) {
//                        e.printStackTrace();
//                    }
//                } else {
//                    logger.error(res.cause().getMessage());
//                    res.cause().printStackTrace();
//                }
//            });
//        } catch (Exception e) {
//            logger.error(Tool.getException(e));
//            e.printStackTrace();
//        }
//    }
//
//    private static void doRedirect(HttpServerResponse response, String url) {
//        response.putHeader("location", url).setStatusCode(302).end();
//    }
//
//    /***
//     * 处理微信支付版回调
//     * @param routingContext
//     */
//    private static void dealCallBackWxpay(RoutingContext routingContext) {
//        routingContext.request().bodyHandler(res -> {
//            try {
//                String bodyStr = res.toString();
//                Document document = DocumentHelper.parseText(bodyStr);
//                // 获取根元素
//                Element root = document.getRootElement();
//                //			System.out.println("Root: " + root.getName());
//                Map<String, String> params = new HashMap<String, String>();
//                JsonObject paramsObj = new JsonObject();
//                //			System.out.println("迭代输出-----------------------");
//                // 迭代输出
//                for (Iterator iter = root.elementIterator(); iter.hasNext(); ) {
//                    Element e = (Element) iter.next();
//                    //	            System.out.println(e.attributeValue("name"));
//                    String name = e.getName();
//                    String valueStr = e.getStringValue();
//                    params.put(name, valueStr);
//                    paramsObj.put(name, valueStr);
//
//                }
//                String appId = params.get("appid");
//                String appkey = ServerParam.getWxpayAppkey(appId);
//                if (appkey == null) {
//                    sendWxcallbackResponse(routingContext, "FAIL", "error appId:" + appId);
//                    return;
//                }
//                logger.info("#### dealCallBackWxpayweb receive:" + paramsObj.toString());
//                String signRec = params.get("sign");//收到的参数中sign字段
//                params.remove("sign");//sign参数不参与签名
//                String stringA = AlipaySignature.getSignContent(params);//调用支付宝的参数排序拼接函数，跟微信规则一样，可通用
//                String stringSignTemp = stringA + "&key=" + appkey; //注：key为商户平台设置的密钥key
//                String sign = Tool.md5encrypt32(stringSignTemp).toUpperCase();//"9A0A8659F005D6984697E2CA0A9CF3B7" //注：MD5签名方式
//                logger.info("#### dealCallBackWxpayweb rec sign = " + signRec + " new sign = " + sign);
//                if (signRec.equalsIgnoreCase(sign)) {//签名验证通过
//                    String return_code = params.get("return_code");
//                    if (return_code.equals("SUCCESS")) {
//                        String transInfo = params.get("transaction_id");
//                        String orderId = params.get("out_trade_no");
//                        double money = Integer.parseInt(params.get("total_fee")) / 100;//单位分
//                        String passbackParams = params.get("attach");
//                        String tmp[] = passbackParams.split("_");
////						long dbid = Long.parseLong(orderId);//iapclick表中的id
//                        long userId = Long.parseLong(tmp[0]);
//                        int platform = Integer.parseInt(tmp[1]);
//                        int iapGiftId = Integer.parseInt(tmp[2]);
//                        IapGift iapGift = getIapGift(iapGiftId);
//                        if (iapGift != null) {
//                            Iap iap = getIap(iapGift.getIapId());
//                            if (iap != null) {
//                                if (!MainVerticle.isDebugServer() && money != iap.getMoney()) {
//                                    logger.error("dealCallBackWxpay error money:" + money + " iap.getMoney:" + iap.getMoney() + " userId:" + userId);
//                                    updateIapClick(userId, orderId, 102, paramsObj.toString());//金额不对
//                                    sendWxcallbackResponse(routingContext, "SUCCESS", null);
//                                    return;
//                                }
//
//                                Future<Object> fut = saveIapOrder(userId, platform, iapGiftId, iap.getMoney(), iapGift.getDiamond(), "", orderId, transInfo);
//                                fut.onComplete(handler -> {
//                                    if (handler.succeeded()) {
//                                        logger.info("dealCallBackWxpay success userId = " + userId + " orderId = " + orderId + " iapGiftId = " + iapGiftId);
//                                        noticeGameReceiveIap(userId, orderId, iapGiftId);
//                                        sendWxcallbackResponse(routingContext, "SUCCESS", null);
//                                        updateIapClick(userId, orderId, 1, paramsObj.toString());//校验成功
//                                    } else {
//                                        sendWxcallbackResponse(routingContext, "SUCCESS", null);
//                                        ;//可能重复订单了
//                                    }
//                                });
//                            } else {
//                                logger.error("dealCallBackWxpay error iapId:" + iapGift.getIapId() + " userId:" + userId);
//                                updateIapClick(userId, orderId, 101, paramsObj.toString());//iapid不存在
//                                sendWxcallbackResponse(routingContext, "SUCCESS", null);
//                            }
//                        } else {
//                            logger.error("dealCallBackWxpay error iapGiftId:" + iapGiftId + " userId:" + userId);
//                            updateIapClick(userId, orderId, 101, paramsObj.toString());//iapid不存在
//                            sendWxcallbackResponse(routingContext, "SUCCESS", null);
//                        }
//                    } else {
//                        //校验失败，忽略
//                        routingContext.response().end();
//                    }
//                } else {
//                    sendWxcallbackResponse(routingContext, "FAIL", "check sign fail!");
//                }
//
//            } catch (Exception e) {
//                logger.error(e.getMessage());
//                e.printStackTrace();
//            }
//        });
//    }
//
//    /***
//     * 发送微信支付回调的响应
//     * @param routingContext
//     * @param return_code
//     * @param return_msg
//     */
//    private static void sendWxcallbackResponse(RoutingContext routingContext, String return_code, String return_msg) {
//        Document document = DocumentHelper.createDocument();//由DocumentHelper得到一个空的Document
//        Element root = document.addElement("xml");
//        document.setXMLEncoding("utf-8");//设置xml头条的Encoding
//        root.addElement("return_code").addCDATA(return_code);
//        if (return_msg != null) {
//            root.addElement("return_msg").addCDATA("return_msg");
//        }
//        routingContext.response().end(document.asXML());
//    }
//
//    private static void updateIapClick(long userId, String orderId, int status, String str) {
//        String sql = "update iap_click set status = ?,callback = ?,callback_time = ? where user_id = ? and order_id = ?;";
//        JsonArray params = new JsonArray();
//        params.add(status);
//        params.add(str);
//        params.add(TimeUtils.getCurTime());
//        params.add(userId);
//        params.add(orderId);
//        MysqlTool.updateToDb(MainVerticle.instance.jdbcClientGame, sql, params, handler -> {
//        });
//    }
//
//    public static Map<String, String> getParamsMap(String str, JsonObject paramsObj) {
//        logger.info("getParamsMap str:" + str + " paramsObj:" + paramsObj.toString());
//        Map<String, String> pmap = new HashMap<String, String>();
//        try {
//            String[] tmp = str.split("&");
//            for (int i = 0; i < tmp.length; i++) {
//                String[] a = tmp[i].split("=");
//                if (a.length >= 2) {
//                    String name = a[0];
//                    String value = java.net.URLDecoder.decode(a[1], "UTF-8");
//                    pmap.put(name, value);
//                    paramsObj.put(name, value);
//                }
//            }
//        } catch (Exception e) {
//            logger.error("getParamsMap str:" + str + " paramsObj:" + paramsObj.toString());
//        }
//        return pmap;
//    }
//
//    public static void testXml() {
//        WebClient webClient = WebClient.create(MainVerticle.instance.vertxInstance);
//
//        String xmlStr = "<xml><appid>wx206b6a16955934dc</appid><mch_id>1486222962</mch_id><nonce_str>tvN75xF9ml2pDn8A</nonce_str><body>60元宝</body><out_trade_no>000000000005018</out_trade_no><total_fee>1</total_fee><spbill_create_ip>117.29.168.126</spbill_create_ip><notify_url>http://kingtest.more2.cn:9090/charge/wxpayweb/receive</notify_url><trade_type>MWEB</trade_type><attach>102_1_0</attach><sign>490D3466B6C2FC1B2EA7D90DA44B1B2A</sign></xml>";
//        String str = "appid=wx206b6a16955934dc&attach=102_1_0&body=60元宝&mch_id=1486222962&nonce_str=tvN75xF9ml2pDn8A&notify_url=http://kingtest.more2.cn:9090/charge/wxpayweb/receive&out_trade_no=000000000005018&spbill_create_ip=117.29.168.126&total_fee=1.0&trade_type=MWEB&key=88d6108d9ee71f109f6988a6d0bddd2d";
//        String sign = "<sign>3B5934ED8F18A5AE658E2B11A94287AD</sign>";
//        String md5 = getMD5(str).toUpperCase();
//        String md52 = Tool.md5encrypt32(str);
//        logger.info("md5:" + md5);
//        logger.info("md2:" + md52);
//        Buffer buffer = Buffer.buffer(xmlStr);
//        //		webClient.post("https://api.mch.weixin.qq.com", "/pay/unifiedorder").sendBuffer(buffer, res->{
//        webClient.postAbs(WxpayConfig.PAY_URL).sendBuffer(buffer, res -> {
//            if (res.succeeded()) {
//                HttpResponse<Buffer> response = res.result();
//                String resStr = response.bodyAsString();
//                logger.info("#### resStr:" + resStr);
//                try {
//                    Document document2 = DocumentHelper.parseText(resStr);
//                } catch (DocumentException e) {
//                    e.printStackTrace();
//                }
//            } else {
//                logger.error(res.cause().getMessage());
//                res.cause().printStackTrace();
//            }
//        });
//    }
//
//    /**
//     * 对字符串md5加密
//     *
//     * @param str
//     * @return
//     */
//    public static String getMD5(String str) {
//        try {
//            // 生成一个MD5加密计算摘要
//            MessageDigest md = MessageDigest.getInstance("MD5");
//            // 计算md5函数
//            md.update(str.getBytes());
//            // digest()最后确定返回md5 hash值，返回值为8为字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
//            // BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
//            return new BigInteger(1, md.digest()).toString(16);
//        } catch (Exception e) {
//            //	        throw new SpeedException("MD5加密出现错误");
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    /***
//     * 处理野火回调
//     * @param routingContext
//     */
////	private static void dealCallBackYehuo(RoutingContext routingContext,WebClient webClient){
////		String key = routingContext.request().getParam("key");
////		String order = routingContext.request().getParam("order");
////		String cporder = routingContext.request().getParam("cporder");
////		String price = routingContext.request().getParam("price");
////		String url = "http://a0a6v4.zhaiday.com:8080/kenshinService/paycheck?key="+key+"&order="+order;
////		logger.info("dealCallBackYehuo key:"+key+" order:"+order+" cporder:"+cporder+" price:"+price+" url:"+url);
////
////		//		WebClient webClient = WebClient.create(MainVerticle.instance.vertxInstance);
////		webClient.getAbs(url).timeout(30000l).send(res->{
////			if(res.succeeded()) {
////				HttpResponse<Buffer> response = res.result();
////				String resStr = response.bodyAsString();
////				if(resStr.equalsIgnoreCase("result=true")) {
////					String tmp[] = cporder.split("_");
////					long dbid = Long.parseLong(tmp[3]);//iapclick表中的id
////					String orderId = tmp[3];
////					long userId =  Long.parseLong(tmp[0]);
////					int platform =  Integer.parseInt(tmp[1]);
////					int iapId = Integer.parseInt(tmp[2]);
////
////					double money = Double.parseDouble(price)/100;
////					logger.info("#### dealCallBackAlipay userid:"+userId+" platform:"+platform+" iapId:"+iapId+" money:"+money);
////					String transInfo = order;
////					Iap iap = IapManager.getIap(iapId);
////					if(iap != null){
////						if(!MainVerticle.isDebugServer()&&money != iap.getMoney()){
////							logger.error("######dealCallBackYehuo error money:"+money+" iap.getMoney:"+iap.getMoney()+" userId:"+userId);
////							updateIapClick(dbid, 102, new JsonObject().put("cporder", cporder).put("price", price).toString());//金额不对
////							routingContext.response().end("result=true");
////							return;
////						}
////						long channel = 5;//临时的
////						if(tmp.length > 4) {
////							channel = Long.parseLong(tmp[4]);//客户端多拼接一个channel字段
////						}
////						Chargepackage cp = LogSDKManager.getChargePackage(platform,channel);
////						String redirectUrl = cp.getRedirect();
////						if(redirectUrl != null && !redirectUrl.isEmpty()) {//转发给评审服
////							redirectUrl += "?uid="+userId+"&platform="+platform+"&iapid="+iapId+"&orderid="+orderId;
////							logger.info("### dealCallBackYehuo redirectUrl:"+redirectUrl);
////							webClient.getAbs(redirectUrl).timeout(30000l).send(res2->{
////								if(res2.succeeded()) {
////									logger.info("### dealCallBackYehuo redirect ok!!!");
////								}else {
////									logger.error("### dealCallBackYehuo redirect error!!! "+res2.cause().getMessage());
////								}
////							});
////						}else {
////							Future<Object> fut = saveIapOrder(userId, platform, iapId, iap.getMoney(), iap.getDiamond(), iap.getProductid(), orderId, transInfo);
////							fut.setHandler(handler->{
////								if(handler.succeeded()){
////									noticeGameReceiveIap(userId, orderId, iapId);
////									updateIapClick(dbid, 1,  new JsonObject().put("cporder", cporder).toString());//校验成功
////								}else{
////
////								}
////
////							});
////						}
////						routingContext.response().end("result=true");
////					}else{
////						logger.error("########dealCallBackYehuo error iapId:"+iapId+" userId:"+userId);
////						updateIapClick(dbid, 101, new JsonObject().put("cporder", cporder).toString());//iapid不存在
////						routingContext.response().end("result=true");
////					}
////				}else {
////					logger.error("## dealCallBackYehuo resStr:"+resStr);
////					routingContext.response().end("result=false");
////				}
////			}else {
////				logger.error("## dealCallBackYehuo error:"+res.cause().getMessage());
////				routingContext.response().end("result=false");
////			}
////		});
////
////	}
//
//    /***
//     * 校验googleplay订单
//     * @param packageName
//     * @param productId
//     * @param purchaseToken
//     * @return
//     */
//    public static ProductPurchase checkGoogleplayPurchase(String packageName, String productId, String purchaseToken) {
//
//
//        try {
//            HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
//            PrivateKey privateKey = SecurityUtils.loadPrivateKeyFromKeyStore(
//                    SecurityUtils.getPkcs12KeyStore(),
//                    new FileInputStream(new File(
//                            System.getProperty("user.dir") + "/google.p12")), // 生成的P12文件
//                    "notasecret", "privatekey", "notasecret");
//            //	        GoogleCredential credential = GoogleCredential
//            //                   .fromStream(new FileInputStream(
//            //                   		System.getProperty("user.dir") +"/google.json"))// 加载服务帐户认证文件
//            //                   .createScoped(SCOPES);
//            String accountId = MainVerticle.instance.appConfig.getString("google-account-id");//"598489518743-compute@developer.gserviceaccount.com";
//            GoogleCredential credential = new GoogleCredential.Builder()
//                    .setTransport(transport).setJsonFactory(JacksonFactory.getDefaultInstance())
//                    .setServiceAccountId(accountId) // e.g.: 626891557797-frclnjv31rn4ss81ch746g9t6pd3mmej@developer.gserviceaccount.com
//                    .setServiceAccountScopes(AndroidPublisherScopes.all())
//                    .setServiceAccountPrivateKey(privateKey).build();
//
//            AndroidPublisher publisher = new AndroidPublisher.Builder(transport,
//                    JacksonFactory.getDefaultInstance(), credential).build();
//
//            AndroidPublisher.Purchases.Products products = publisher.purchases().products();
//            //	        String purchaseToken = "cofgenbfmpjdpklleaionfge.AO-J1OxTEBRLsorSQGnpMGSYeeM4YoFbrAHhZl4I4n-JRPA89UJ_xLYHEidQwS0whKpgoPMm-5TSkoCgyomSjHOJ5QBcIJ_Eu29ILMRAw-2oeCObTvWAkQ0k8mTiUJRIDtbmGD2ofUm1yEm9n8VneVP7f60ptIprGg";
//            //				String purchaseToken = "cclomnacefdealmnafamfedk.AO-J1OyZPH9ZRWQ7eUgHoLjmtzL_-YAeH-h6_eiAimT69AInOz_FFGQnx6g2b5ZYPaZZ_3LSpWROGlaYKXDuDpFw-cpxm38N1T-8da-cBwPrkIucNeOcrTDxL69OuKRY4udSh9BhdFQkupd7817lzlfS_7NIfRErTA";
//            //				String packageName = "com.motu.zhanguo.twgp";
//            //				String productId = "com.motu.zhanguo.twgp.300";
//            // 参数详细说明: https://developers.google.com/android-publisher/api-ref/purchases/products/get
//            AndroidPublisher.Purchases.Products.Get product = products.get(packageName, productId, purchaseToken);
//
//            // 获取订单信息
//            // 返回信息说明: https://developers.google.com/android-publisher/api-ref/purchases/products
//            // 通过consumptionState, purchaseState可以判断订单的状态
//            ProductPurchase purchase = product.execute();
//            //				logger.info("purchaseState:"+purchase.getPurchaseState());
//            //				logger.info("consumptionState:"+purchase.getConsumptionState());
//            //				logger.info("developerPayload:"+purchase.getDeveloperPayload());
//            logger.info("checkGoogleplayPurchase:" + purchase.toPrettyString());
//            return purchase;
//            //	        consumptionState：商品消费状态，0表还未消费，1表消费了（因为google的同一个商品未消费的话是不允许重复购买的）
//            //	        developerPayload：这个比较重要，是我们开发者自定义透传的，一般为自身系统订单号之类的交易唯一标示，可以用来比对
//            //	        purchaseState：购买状态，  0:Purchased  1:Cancelled 我们就是依靠这个判断购买信息
//            //	        备注：貌似这个api调用google平台有20w/日的次数限制
//        } catch (KeyStoreException e) {
//            logger.error(e.getMessage());
//        } catch (FileNotFoundException e) {
//            logger.error(e.getMessage());
//        } catch (IOException e) {
//            logger.error(e.getMessage());
//        } catch (GeneralSecurityException e) {
//            logger.error(e.getMessage());
//        }
//        return null;
//    }
//
//    /***
//     * 发送收据到app验证
//     * @param webClient
//     * @param isSandBox
//     * @param receipt
//     * @return
//     */
//    public static Future<JsonObject> checkAppReceipt(WebClient webClient, boolean isSandBox, String receipt) {
//        Promise<JsonObject> fut = Promise.promise();
//        String urlstr;
//        if (isSandBox) {
//            urlstr = "https://sandbox.itunes.apple.com/verifyReceipt";
//        } else {
//            urlstr = "https://buy.itunes.apple.com/verifyReceipt";
//        }
//        JsonObject obj = new JsonObject().put("receipt-data", receipt);
//        webClient.postAbs(urlstr).timeout(10000).sendJson(obj, res -> {
//            if (res.succeeded()) {
//                HttpResponse<Buffer> response = res.result();
//                int code = response.statusCode();
//                JsonObject resObj = response.bodyAsJsonObject();
//                logger.info("#### receive checkAppReceipt httpCode:" + code + " response:" + response.bodyAsString());
//                fut.complete(resObj);
//            } else {
//                logger.error(res.cause().getMessage());
//                res.cause().printStackTrace();
//                fut.fail(res.cause().getMessage());
//            }
//        });
//        return fut.future();
//    }
//
//    /***
//     * 畅梦充值回调
//     * @param routingContext
//     */
//    @SuppressWarnings("unchecked")
//    private static void dealCallBackChangemeng(RoutingContext routingContext) {
//        logger.info("dealCallBackChangemeng !!!");
//        HttpServerRequest request = routingContext.request();
//        request.setExpectMultipart(true);
//        request.endHandler(req -> {
//            MultiMap map = routingContext.request().formAttributes();
//            Map<String, String> params = new HashMap<String, String>();
//            logger.info("#### dealCallBackChangemeng!! map.size:" + map.size());
//            Iterator<Entry<String, String>> it = map.iterator();
//            JsonObject obj = new JsonObject();
//            while (it.hasNext()) {
//                Entry<String, String> entry = it.next();
//                String key = entry.getKey();
//                String value = entry.getValue();
//                if (value == null) {
//                    value = "";
//                }
//                params.put(key, value);
//                obj.put(key, value);
//            }
//            String str = obj.toString();
//            logger.info("#### dealCallBackChangemeng str:" + str);
//            String content = Tool.getSignCheckContent(params, true);
//            String postSign = map.get("sign");
//            String checkSign = Tool.jdkHmacMD5(content, ServerParam.GAME_SECRET_KEY_CHANGMENG);
//            logger.info("#### dealCallBackChangemeng content:" + content);
//            logger.info("#### dealCallBackChangemeng postSign:" + postSign);
//            logger.info("#### dealCallBackChangemeng checkSign:" + checkSign);
//            if (postSign.equalsIgnoreCase(checkSign)) {//验证成功
//
//                logger.info("#### dealCallBackChangemeng verify_result ok!!!!!!!!!!!!!");
//                //////////////////////////////////////////////////////////////////////////////////////////
//                //				sdk_order_id: SDK订单ID
//                //				cp_order_id:游戏方订单ID，由游戏客户端生成
//                //				server_id:游戏区服ID
//                //				pf_uid:渠道平台的UID
//                //				cp_uid:游戏方自己帐户UID(游戏方无帐户UID，可使用角色ID代替)
//                //				role_id:游戏方自己的角色ID
//                //				pay_amount:支付金额(int,单位分，CP方需要验证是否与计费点金额一致)
//                //				pay_time:支付时间（2017-01-01 12:35:33）
//                //				goods_id:计费点ID（商品ID，CP方需要验证是否与支付金额一致）
//                //				cp_extra:CP透传字段，由游戏客户端调用SDK支付接口时传入
//                //				sandbox:沙盒环境(0-正式，1-沙盒测试，主要用于双方对帐时去除测试金额，无严格要求的CP方可暂时忽略该字段)
//                //				sign:签名校验串，请游戏方务必验证此sign正确性，否则极易出现黑客盗刷CP方发货接口，造成严重后果。
//
//
//                String orderId = params.get("cp_order_id");
//                String passbackParams = params.get("cp_extra");
//                String tmp[] = passbackParams.split("_");
//
//                int platform = Integer.parseInt(tmp[0]);
//                int iapGiftId = Integer.parseInt(tmp[1]);
//                long userId = Long.parseLong(params.get("role_id"));
//                double money = Integer.parseInt(params.get("pay_amount")) / 100;
//                logger.info("#### dealCallBackChangemeng userid:" + userId + " platform:" + platform + " iapGiftId:" + iapGiftId + " money:" + money);
//                String transInfo = params.get("sdk_order_id");
//                IapGift iapGift = getIapGift(iapGiftId);
//                if (iapGift != null) {
//                    Iap iap = getIap(iapGift.getIapId());
//                    if (iap != null) {
//                        if (!MainVerticle.isDebugServer() && money != iap.getMoney()) {
//                            logger.error("######dealCallBackChangemeng error money:" + money + " iap.getMoney:" + iap.getMoney() + " userId:" + userId);
//                            updateIapClick(userId, orderId, 102, str);//金额不对
//                            routingContext.response().end("success");
//                            return;
//                        }
//
//                        Future<Object> fut = saveIapOrder(userId, platform, iapGiftId, iap.getMoney(), iapGift.getDiamond(), "", orderId, transInfo);
//                        fut.onComplete(handler -> {
//                            if (handler.succeeded()) {
//                                noticeGameReceiveIap(userId, orderId, iapGiftId);
//                                routingContext.response().end("success");
//                                updateIapClick(userId, orderId, 1, str);//校验成功
//                            } else {
//                                routingContext.response().end("success");//可能重复订单了
//                            }
//                        });
//                    } else {
//                        logger.error("########dealCallBackChangemeng error iapId:" + iapGift.getIapId() + " userId:" + userId);
//                        updateIapClick(userId, orderId, 101, str);//iapid不存在
//                        routingContext.response().end("success");
//                    }
//                } else {
//                    logger.error("########dealCallBackChangemeng error iapGiftId:" + iapGiftId + " userId:" + userId);
//                    updateIapClick(userId, orderId, 101, str);//iapid不存在
//                    routingContext.response().end("success");
//                }
//
//
//                //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
//                //				routingContext.response().end("success");
//                //				out.println("success");	//请不要修改或删除
//
//                //////////////////////////////////////////////////////////////////////////////////////////
//            } else {//验证失败
//                logger.error("#### dealCallBackChangemeng verify_result fail!!!!!!!!!!!!! postSign:" + postSign + " checkSign:" + checkSign);
//                routingContext.response().end("fail");
//            }
//        });
//
//
//    }
//
//    /***
//     * 畅梦充值回调
//     * @param routingContext
//     */
//    private static void dealCallBack9377(RoutingContext routingContext) {
//
//        String order_id = routingContext.request().getParam("order_id");
//        String user_id = routingContext.request().getParam("user_id");
//        String server_id = routingContext.request().getParam("server_id");
//        String money = routingContext.request().getParam("money");
//        String extra_info = routingContext.request().getParam("extra_info");
//        String sign = routingContext.request().getParam("sign");
//        String time = routingContext.request().getParam("time");
//        String sandbox = routingContext.request().getParam("sandbox");
//        String str = routingContext.request().query();
//        //		签名: md5(order_id+ user_id+server_id+money +extra_info +'#'+ secret_key)
//        //		routingContext.request().bodyHandler(res->{
//        //			try {
//        //				//获取支付宝POST过来反馈信息
//        //
//        //				String str = res.toString();
//        //				Map<String,String> params = Tool.getParamsMap(str);
//        //				String content = Tool.getSignCheckContent(params, true);
//        //				String postSign = params.get("sign");
//        logger.info("dealCallBack9377 str:" + str);
//        String checkStr = order_id + user_id + server_id + money + extra_info + time + '#' + ServerParam.GAME_SECRET_KEY_9377;
//        String checkSign = Tool.md5encrypt32(checkStr);
//        JsonObject retObj = new JsonObject().put("state", 1);
//        logger.info("dealCallBack9377 checkSign:" + checkSign + " sign:" + sign);
//        if (sign.equalsIgnoreCase(checkSign)) {//验证成功
//
//            logger.info("#### dealCallBack9377 verify_result ok!!!!!!!!!!!!!");
//
//
//            String tmp[] = extra_info.split("_");
//            String orderId = tmp[0];
//            int platform = Integer.parseInt(tmp[1]);
//            int iapGiftId = Integer.parseInt(tmp[2]);
//            long userId = Long.parseLong(tmp[3]);
//
//            logger.info("#### dealCallBack9377 userid:" + userId + " platform:" + platform + " iapGiftId:" + iapGiftId + " money:" + money);
//            double orderMoney = Double.parseDouble(money);
//            String transInfo = order_id;
//            IapGift iapGift = getIapGift(iapGiftId);
//            if (iapGift != null) {
//                Iap iap = getIap(iapGift.getIapId());
//                if (iap != null) {
//                    if (!MainVerticle.isDebugServer() && orderMoney != iap.getMoney()) {
//                        logger.error("######dealCallBack9377 error money:" + money + " iap.getMoney:" + iap.getMoney() + " userId:" + userId);
//                        updateIapClick(userId, orderId, 102, str);//金额不对
//                        routingContext.response().end(retObj.put("msg", "金额不对").toString());
//                        return;
//                    }
//
//                    Future<Object> fut = saveIapOrder(userId, platform, iapGiftId, iap.getMoney(), iapGift.getDiamond(), "", orderId, transInfo);
//                    fut.onComplete(handler -> {
//                        if (handler.succeeded()) {
//                            noticeGameReceiveIap(userId, orderId, iapGiftId);
//                            routingContext.response().end(retObj.put("msg", "充值成功").toString());
//                            updateIapClick(userId, orderId, 1, str);//校验成功
//                        } else {
//                            routingContext.response().end(retObj.put("msg", "重复充值").toString());//可能重复订单了
//                        }
//                    });
//                } else {
//                    logger.error("########dealCallBack9377 error iapId:" + iapGift.getIapId() + " userId:" + userId);
//                    updateIapClick(userId, orderId, 101, str);//iapid不存在
//                    routingContext.response().end(retObj.put("msg", "充值项不存在").toString());
//                }
//            } else {
//                logger.error("########dealCallBack9377 error iapGiftId:" + iapGiftId + " userId:" + userId);
//                updateIapClick(userId, orderId, 101, str);//iapid不存在
//                routingContext.response().end(retObj.put("msg", "充值项不存在").toString());
//            }
//
//
//            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
//            //				routingContext.response().end("success");
//            //				out.println("success");	//请不要修改或删除
//
//            //////////////////////////////////////////////////////////////////////////////////////////
//        } else {//验证失败
//            logger.error("#### dealCallBack9377 verify_result fail!!!!!!!!!!!!!");
//            routingContext.response().end(retObj.put("msg", "校验失败").toString());
//        }
//        //			}  catch (Exception e) {
//        //				logger.error(e.getMessage());
//        //				e.printStackTrace();
//        //			}
//        //		});
//
//
//    }
//
//    private static void dealCallBackMuyouGet(RoutingContext routingContext) {
//        MultiMap map = routingContext.request().params();
//        dealCallBackMuyou(routingContext, map);
//    }
//
//    private static void dealCallBackMuyouPost(RoutingContext routingContext) {
//        HttpServerRequest request = routingContext.request();
//        request.setExpectMultipart(true);
//        request.endHandler(req -> {
//            MultiMap map = routingContext.request().formAttributes();
//            dealCallBackMuyou(routingContext, map);
//        });
//    }
//
//    /***
//     * 沐游充值回调
//     */
//    @SuppressWarnings("unchecked")
//    private static void dealCallBackMuyou(RoutingContext routingContext, MultiMap map) {
//        logger.info("dealCallBackMuyou !!!");
//        try {
//            Map<String, String> params = new HashMap<String, String>();
//            logger.info("#### dealCallBackMuyou!! map.size:" + map.size());
//            Iterator<Entry<String, String>> it = map.iterator();
//            JsonObject obj = new JsonObject();
//            while (it.hasNext()) {
//                Entry<String, String> entry = it.next();
//                String key = entry.getKey();
//                String value = entry.getValue();
//                if (value == null) {
//                    value = "";
//                }
//                params.put(key, value);
//                obj.put(key, value);
//            }
//
//            String str = obj.toString();
//            logger.info("#### dealCallBackMuyou str:" + str);
//
//            // 支付key
//            String passbackParams = params.get("extra");
//            String tmp[] = passbackParams.split("_");
//            long userId = Long.parseLong(tmp[0]);
//            int platform = Integer.parseInt(tmp[1]);
//            int iapGiftId = Integer.parseInt(tmp[2]);
//            String payKey;
//            if (platform == Platform.PLATFORM_MUYOU_IOS) {
//                payKey = ServerParam.GAME_PAY_KEY_MUYOU_IOS;
//            } else if (platform == Platform.PLATFORM_MUYOU_ANDROID) {
//                payKey = ServerParam.GAME_PAY_KEY_MUYOU_ANDROID;
//            } else {
//                logger.error("######dealCallBackMuyou error platform = " + platform);
//                routingContext.response().end(new JsonObject().put("code", "201").toString());// 参数错误
//                return;
//            }
//
//            // 验证sign
//            String postSign = params.get("sign");
//            String postData = Tool.getSignCheckContent(params, false);
//            String checkSign = Tool.md5encrypt32(postData + payKey).toUpperCase();
//            logger.info("#### dealCallBackMuyou postData:" + postData + " postSign:" + postSign + " checkSign:" + checkSign);
//            if (postSign.equalsIgnoreCase(checkSign)) {//验证成功
//                logger.info("#### dealCallBackMuyou verify_result ok!!!!!!!!!!!!!");
//                String orderId = params.get("orderno_cp");
//                int money = Integer.parseInt(params.get("pay_amt"));
//                logger.info("#### dealCallBackMuyou userid:" + userId + " platform:" + platform + " iapGiftId:" + iapGiftId + " money:" + money);
//                String transInfo = params.get("orderno");
//                IapGift iapGift = getIapGift(iapGiftId);
//                if (iapGift != null) {
//                    Iap iap = getIap(iapGift.getIapId());
//                    if (iap != null) {
////					if(!MainVerticle.isDebugServer()&&money != iap.getMoney()){
////						logger.error("######dealCallBackChangemeng error money:"+money+" iap.getMoney:"+iap.getMoney()+" userId:"+userId);
////						updateIapClick(userId,orderId, 102, str);//金额不对
////						routingContext.response().end("success");
////						return;
////					}
//
//                        Future<Object> fut = saveIapOrder(userId, platform, iapGiftId, iap.getMoney(), iapGift.getDiamond(), "", orderId, transInfo);
//                        fut.onComplete(handler -> {
//                            if (handler.succeeded()) {
//                                noticeGameReceiveIap(userId, orderId, iapGiftId);
//                                routingContext.response().end(new JsonObject().put("code", "200").toString());// 成功
//                                updateIapClick(userId, orderId, 1, str);//校验成功
//                            } else {
//                                routingContext.response().end(new JsonObject().put("code", "202").toString());//可能重复订单了
//                            }
//                        });
//                    } else {
//                        logger.error("########dealCallBackMuyou error iapId:" + iapGift.getIapId() + " userId:" + userId);
//                        updateIapClick(userId, orderId, 101, str);//iapid不存在
//                        routingContext.response().end(new JsonObject().put("code", "202").toString());
//                    }
//                } else {
//                    logger.error("########dealCallBackMuyou error iapGiftId:" + iapGiftId + " userId:" + userId);
//                    updateIapClick(userId, orderId, 101, str);//iapid不存在
//                    routingContext.response().end(new JsonObject().put("code", "202").toString());
//                }
//
//            } else {//验证失败
//                logger.error("#### dealCallBackMuyou verify_result fail!!!!!!!!!!!!! postSign:" + postSign + " checkSign:" + checkSign);
//                routingContext.response().end(new JsonObject().put("code", "203").toString());// 签名校验失败
//            }
//        } catch (Exception e) {
//            logger.error("#### dealCallBackMuyou Exception cause = " + Tool.getException(e));
//            routingContext.response().end(new JsonObject().put("code", "202").toString());// 异常错误
//        }
//    }
//
//    private static void dealCallBackMuyouResvervationGet(RoutingContext routingContext) {
//        MultiMap map = routingContext.request().params();
//        dealCallBackMuyouResvervation(routingContext, map);
//    }
//
//    private static void dealCallBackMuyouResvervationPost(RoutingContext routingContext) {
//        HttpServerRequest request = routingContext.request();
//        request.setExpectMultipart(true);
//        request.endHandler(req -> {
//            MultiMap map = routingContext.request().formAttributes();
//            dealCallBackMuyouResvervation(routingContext, map);
//        });
//    }
//
//    /***
//     * 沐游gp预约礼包回调
//     */
//    @SuppressWarnings("unchecked")
//    private static void dealCallBackMuyouResvervation(RoutingContext routingContext, MultiMap map) {
//        logger.info("dealCallBackMuyouResvervation !!!");
//        try {
//            Map<String, String> params = new HashMap<String, String>();
//            logger.info("#### dealCallBackMuyouResvervation!! map.size:" + map.size());
//            Iterator<Entry<String, String>> it = map.iterator();
//            JsonObject obj = new JsonObject();
//            while (it.hasNext()) {
//                Entry<String, String> entry = it.next();
//                String key = entry.getKey();
//                String value = entry.getValue();
//                if (value == null) {
//                    value = "";
//                }
//                params.put(key, value);
//                obj.put(key, value);
//            }
//
//            String str = obj.toString();
//            logger.info("#### dealCallBackMuyouResvervation str:" + str);
//            Long cp_role_id = Long.valueOf(params.get("cp_role_id"));//用户id
//            String payKey = ServerParam.GAME_PAY_KEY_MUYOU_ANDROID;// 支付key
//            String product_id = params.get("product_id");
//            Long userid = Long.valueOf(params.get("userid"));
//            int server_id = Integer.parseInt(params.get("server_id"));
//            // 验证sign
//            String postSign = params.get("sign");
//            String postData = Tool.getSignCheckContent(params, false);
//            String checkSign = Tool.md5encrypt32(postData + payKey).toUpperCase();
//            logger.info("#### dealCallBackMuyouResvervation postData:" + postData + " postSign:" + postSign + " checkSign:" + checkSign);
//            if (postSign.equalsIgnoreCase(checkSign)) {//验证成功
//                logger.info("#### dealCallBackMuyouResvervation userid:" + userid + " server_id:" + server_id + " cp_role_id:" + cp_role_id + " product_id:" + product_id);
//                //通知游戏服 发预约奖励 邮件
//                JsonObject message = new JsonObject();
//                message.put("cmd", Constant.CMD_RESERVATION_GIFT);
//                message.put("data", new JsonObject().put("userid", cp_role_id));
//                String ebName = Constant.getEventBusName(MainVerticle.getLocalName(), Constant.EVENT_BUS_GAME_CUSTOM_LOGIC);
//                EventBus eventBus = MainVerticle.instance.vertxInstance.eventBus();
//                eventBus.request(ebName, message, h -> {
//                    if (h.succeeded()) {
//                        JsonObject result = (JsonObject) h.result().body();
//                        routingContext.response().end(result.toString());
//                    } else {
//                        logger.info("#### dealCallBackMuyouResvervation eventBus.send failed:" + h.cause().getMessage());
//                        routingContext.response().end(new JsonObject().put("code", "204").toString());// 异常错误
//                    }
//                });
//            } else {
//                //验证失败
//                logger.error("#### dealCallBackMuyouResvervation verify_result fail!!!!!!!!!!!!! postSign:" + postSign + " checkSign:" + checkSign);
//                routingContext.response().end(new JsonObject().put("code", "203").toString());// 签名校验失败
//            }
//
//        } catch (Exception e) {
//            logger.error("#### dealCallBackMuyouResvervation Exception cause = " + Tool.getException(e));
//            routingContext.response().end(new JsonObject().put("code", "202").toString());// 异常错误
//        }
//    }
//
//
//    private static void dealCallBackMuyouWeborderGet(RoutingContext routingContext, String type) {
//        MultiMap map = routingContext.request().params();
//        dealCallBackMuyouWeborder(routingContext, map, type);
//    }
//
//    private static void dealCallBackMuyouWeborderPost(RoutingContext routingContext, String type) {
//        HttpServerRequest request = routingContext.request();
//        request.setExpectMultipart(true);
//        request.endHandler(req -> {
//            MultiMap map = routingContext.request().formAttributes();
//            dealCallBackMuyouWeborder(routingContext, map, type);
//        });
//    }
//
//    /***
//     * 沐游网页下单
//     */
//    @SuppressWarnings("unchecked")
//    private static void dealCallBackMuyouWeborder(RoutingContext routingContext, MultiMap map, String type) {
//        logger.info("dealCallBackMuyouWeborder !!!");
//        try {
//            Map<String, String> params = new HashMap<String, String>();
//            logger.info("#### dealCallBackMuyouWeborder!! map.size:" + map.size());
//            Iterator<Entry<String, String>> it = map.iterator();
//            JsonObject obj = new JsonObject();
//            while (it.hasNext()) {
//                Entry<String, String> entry = it.next();
//                String key = entry.getKey();
//                String value = entry.getValue();
//                if (value == null) {
//                    value = "";
//                }
//                params.put(key, value);
//                obj.put(key, value);
//            }
//
//            String str = obj.toString();
//            logger.info("#### dealCallBackMuyouWeborder str:" + str);
//
//            Long cp_role_id = Long.valueOf(params.get("cp_role_id"));//用户id
//
//            String payKey = null;// 支付key
//            String packageName = null;// 包名
//            if (type.equals("IOS")) {
//                payKey = ServerParam.GAME_PAY_KEY_MUYOU_IOS;// ios支付key
//                packageName = "com.vn.symx.as";
//            } else if (type.equals("ANDROID")) {
//                payKey = ServerParam.GAME_PAY_KEY_MUYOU_ANDROID;// 安卓支付key
//                packageName = "com.vn.symx.gp";
//            } else {
//                logger.error("#### dealCallBackMuyouWeborder error type:" + type);
//                routingContext.response().end(new JsonObject().put("code", "201").toString());// 参数错误
//            }
//
//            if (!params.containsKey("userid") || Tool.isEmpty(params.get("userid"))) {
//                logger.error("#### dealCallBackMuyouWeborder error userid:" + params.get("userid"));
//                routingContext.response().end(new JsonObject().put("code", "201").toString());// 参数错误
//            }
//            String product_id = params.get("product_id");
//            Long userid = Long.valueOf(params.get("userid"));
//            int server_id = Integer.parseInt(params.get("server_id"));
//            String[] productList = product_id.split("\\.");
//            int productid_suffix = Integer.parseInt(productList[productList.length - 1]);
//            //支持网页下单的iap productid_suffix (产品ID后缀)--日常充值项和月卡
//            int[] iapIdList = new int[]{1, 2, 3, 4, 5, 6, 7};
//            int[] productIdList = new int[]{6, 30, 98, 198, 328, 648, 250};
//            int iapId = 0;
//            for (int i = 0; i < productIdList.length; i++) {
//                if (productIdList[i] == productid_suffix) {
//                    iapId = iapIdList[i];
//                }
//            }
//            if (iapId == 0) {
//                logger.error("#### dealCallBackMuyouWeborder error product_id:" + product_id);
//                routingContext.response().end(new JsonObject().put("code", "204").toString());// 不能购买此商品
//            }
//            // 验证sign
//            String postSign = params.get("sign");
//            String postData = Tool.getSignCheckContent(params, false);
//            String checkSign = Tool.md5encrypt32(postData + payKey).toUpperCase();
//            logger.info("#### dealCallBackMuyouWeborder postData:" + postData + " postSign:" + postSign + " checkSign:" + checkSign);
//            if (postSign.equalsIgnoreCase(checkSign)) {//验证成功
//                logger.info("#### dealCallBackMuyouWeborder userid:" + userid + " server_id:" + server_id + " cp_role_id:" + cp_role_id + " product_id:" + product_id);
//                Future<JsonObject> fut = getUserExtInfo(cp_role_id);
//                int finalIapId = iapId;
//                String finalPackageName = packageName;
//                fut.onComplete(handler -> {
//                    if (handler.succeeded()) {
//                        JsonObject userextinfo = fut.result();
//                        String uuid = Tool.getUUID();
//                        String orderSql = "INSERT INTO iap_click(user_id,iap_id,order_id,add_time) values(?,?,?,?);";
//                        JsonArray orderParams = new JsonArray().add(cp_role_id).add(finalIapId).add(uuid).add(TimeUtils.getCurTime());
//                        MysqlTool.insertAndGetID(MainVerticle.instance.jdbcClientGame, orderSql, orderParams, orderhandler -> {
//                            if (orderhandler.succeeded()) {
//                                Long newId = orderhandler.result();//只返回插入后的自增值而已
//                                if (newId != null) {
//                                    String extra = cp_role_id + "_" + userextinfo.getInteger("platform") + "_" + finalIapId + "_" + ServerParam.MOTU_WEBID + "_" + ServerParam.MOTU_SDK_GAMEID + "_" + finalPackageName;
//                                    JsonObject result = new JsonObject();
//                                    result.put("code", "200");
//                                    result.put("msg", "success");
//                                    JsonObject data = new JsonObject();
//                                    data.put("cp_order_no", uuid);
//                                    data.put("extra", extra);
//                                    result.put("data", data);
//                                    routingContext.response().end(result.toString());// 成功
//                                } else {
//                                    logger.error("#### dealCallBackMuyouWeborder getOrderid error cp_role_id:" + cp_role_id);
//                                    routingContext.response().end(new JsonObject().put("code", "201").toString());// 参数错误
//                                }
//                            } else {
//                                logger.error("#### dealCallBackMuyouWeborder insert orderid error cp_role_id:" + cp_role_id);
//                                routingContext.response().end(new JsonObject().put("code", "204").toString());// 数据库插入失败
//                            }
//                        });
//
//                    } else {
//                        logger.error("#### dealCallBackMuyouWeborder getPlatform error cp_role_id:" + cp_role_id);
//                        routingContext.response().end(new JsonObject().put("code", "201").toString());// 参数错误
//                    }
//                });
//            } else {
//                //验证失败
//                logger.error("#### dealCallBackMuyouWeborder verify_result fail!!!!!!!!!!!!! postSign:" + postSign + " checkSign:" + checkSign);
//                routingContext.response().end(new JsonObject().put("code", "203").toString());// 签名校验失败
//            }
//        } catch (Exception e) {
//            logger.error("#### dealCallBackMuyouWeborder Exception cause = " + Tool.getException(e));
//            routingContext.response().end(new JsonObject().put("code", "202").toString());// 异常错误
//        }
//    }
//
//    private static void dealCallBackMuyouWebresvervegiftGet(RoutingContext routingContext, String type) {
//        MultiMap map = routingContext.request().params();
//        dealCallBackMuyouWebresvervegift(routingContext, map, type);
//    }
//
//    private static void dealCallBackMuyouWebresvervegiftPost(RoutingContext routingContext, String type) {
//        HttpServerRequest request = routingContext.request();
//        request.setExpectMultipart(true);
//        request.endHandler(req -> {
//            MultiMap map = routingContext.request().formAttributes();
//            dealCallBackMuyouWebresvervegift(routingContext, map, type);
//        });
//    }
//
//    /***
//     * 沐游官网预约礼包回调
//     */
//    @SuppressWarnings("unchecked")
//    private static void dealCallBackMuyouWebresvervegift(RoutingContext routingContext, MultiMap map, String type) {
//        logger.info("dealCallBackMuyouWebresvervegift !!!");
//        try {
//            Map<String, String> params = new HashMap<String, String>();
//            logger.info("#### dealCallBackMuyouWebresvervegift!! map.size:" + map.size());
//            Iterator<Entry<String, String>> it = map.iterator();
//            JsonObject obj = new JsonObject();
//            while (it.hasNext()) {
//                Entry<String, String> entry = it.next();
//                String key = entry.getKey();
//                String value = entry.getValue();
//                if (value == null) {
//                    value = "";
//                }
//                params.put(key, value);
//                obj.put(key, value);
//            }
//            String str = obj.toString();
//            logger.info("#### dealCallBackMuyouWebresvervegift str:" + str);
//            Long cp_role_id = Long.valueOf(params.get("cp_role_id"));//用户id
//            String payKey = null;// 支付key
//            if (type.equals("IOS")) {
//                payKey = ServerParam.GAME_PAY_KEY_MUYOU_IOS;// ios支付key
//            } else if (type.equals("ANDROID")) {
//                payKey = ServerParam.GAME_PAY_KEY_MUYOU_ANDROID;// 安卓支付key
//            } else {
//                logger.error("#### dealCallBackMuyouWebresvervegift error type:" + type);
//                routingContext.response().end(new JsonObject().put("code", "201").toString());// 参数错误
//            }
//            //目前不需要校验的参数
//            Long userid = Long.valueOf(params.get("userid"));
//            int server_id = Integer.parseInt(params.get("server_id"));
//
//            String product_id = params.get("product_id");
//            String[] productList = product_id.split("\\.");
//            int giftid = Integer.parseInt(productList[productList.length - 1]);//礼包id
//
//            // 验证sign
//            String postSign = params.get("sign");
//            String postData = Tool.getSignCheckContent(params, false);
//            String checkSign = Tool.md5encrypt32(postData + payKey).toUpperCase();
//            logger.info("#### dealCallBackMuyouWebresvervegift postData:" + postData + " postSign:" + postSign + " checkSign:" + checkSign);
//            if (postSign.equalsIgnoreCase(checkSign)) {//验证成功
//                logger.info("#### dealCallBackMuyouWebresvervegift userid:" + userid + " server_id:" + server_id + " cp_role_id:" + cp_role_id + " product_id:" + product_id);
//                //通知游戏服 发预约礼包奖励 邮件
//                JsonObject message = new JsonObject();
//                message.put("cmd", Constant.CMD_WEB_RESERVATION_GIFT);
//                message.put("data", new JsonObject().put("userid", cp_role_id).put("giftid", giftid));
//                String ebName = Constant.getEventBusName(MainVerticle.getLocalName(), Constant.EVENT_BUS_GAME_CUSTOM_LOGIC);
//                EventBus eventBus = MainVerticle.instance.vertxInstance.eventBus();
//                eventBus.request(ebName, message, h -> {
//                    if (h.succeeded()) {
//                        JsonObject result = (JsonObject) h.result().body();
//                        routingContext.response().end(result.toString());
//                    } else {
//                        logger.info("#### dealCallBackMuyouWebresvervegift eventBus.send failed:" + h.cause().getMessage());
//                        routingContext.response().end(new JsonObject().put("code", "204").toString());// 异常错误
//                    }
//                });
//            } else {
//                //验证失败
//                logger.error("#### dealCallBackMuyouWebresvervegift verify_result fail!!!!!!!!!!!!! postSign:" + postSign + " checkSign:" + checkSign);
//                routingContext.response().end(new JsonObject().put("code", "203").toString());// 签名校验失败
//            }
//
//        } catch (Exception e) {
//            logger.error("#### dealCallBackMuyouWebresvervegift Exception cause = " + Tool.getException(e));
//            routingContext.response().end(new JsonObject().put("code", "202").toString());// 异常错误
//        }
//    }
//
//    /***
//     * 读取userextinfo信息
//     * @param userId 用户id
//     * @return
//     */
//    private static Future<JsonObject> getUserExtInfo(long userId) {
//        Promise<JsonObject> fut = Promise.promise();
//        String tableName = "user_ext_info";
//        String userExtInfoKey = RedisKey.getUserExtInfoKey(userId);
//        RedisTools.getHashJsonObject(MainVerticle.instance.redisClient, userExtInfoKey, res -> {
//            JsonObject obj = res.result();
//            if (obj != null) {
//                if (!obj.containsKey("id")) {//从数据库中再读取一下
//                    String sql = "select platform from " + tableName + " where id = ?";
//                    JsonArray params = new JsonArray();
//                    params.add(userId);
//                    MysqlTool.queryJsonArrayFromDb(MainVerticle.instance.jdbcClientGame, sql, params, handler -> {
//                        if (handler.succeeded()) {
//                            if (handler.result().size() > 0) {
//                                JsonObject dbobj = handler.result().getJsonObject(0);
//                                fut.complete(dbobj);
//                            } else {
//                                fut.fail("has not user!");
//                                logger.error("### has not user getUserExtInfo:" + userId);
//                            }
//                        } else {
//                            fut.fail(handler.cause().getMessage());
//                            logger.error(handler.cause().getMessage());
//                        }
//                    });
//                } else {
//                    int platform = Tool.stringToInt(obj.getString("platform"));
//                    JsonObject redisObj = new JsonObject().put("platform", platform);
//                    fut.complete(redisObj);
//                }
//            } else {
//                fut.fail("redis query failed");
//                logger.error("### redis query failed getUserExtInfo:" + userId);
//            }
//        });
//        return fut.future();
//    }
//
//    /***
//     * 记录客户端充值日志
//     */
//    private static void dealChargeClientLog(RoutingContext routingContext) {
//        routingContext.request().bodyHandler(res-> {
//
//            // 获取参数
//            JsonObject bodyObj = new JsonObject(res.toString());
//            long userid = bodyObj.getLong("userid");
//            int iapid = bodyObj.getInteger("iapid");
//            String orderid = bodyObj.getString("orderid");
//            int type = bodyObj.getInteger("type");
//            String content = bodyObj.getString("content");
//
//            // 写入数据库
//            String sql = "insert into client_charge_log(userid,iapid,orderid,type,addtime,content) values(?,?,?,?,?,?);";
//            JsonArray params = new JsonArray();
//            params.add(userid);
//            params.add(iapid);
//            params.add(orderid);
//            params.add(type);
//            params.add(TimeUtils.getCurTime());
//            params.add(content);
//            MysqlTool.updateToDb(MainVerticle.instance.jdbcClientServer, sql, params, handler->{
//                if (handler.succeeded()){
//                    routingContext.response().end("OK");
//                } else{
//                    routingContext.response().end("ERROR");
//                    logger.error("dealChargeClientLog error cause = {}", Tool.getException(handler.cause()));
//                }
//            });
//
//        });
//
//    }
//
//    private static void dealCallBackUjoyGet(RoutingContext routingContext){
//        MultiMap map = routingContext.request().params();
//        dealCallBackUjoy(routingContext, map);
//    }
//
//    private static void dealCallBackUjoyPost(RoutingContext routingContext){
//        HttpServerRequest request = routingContext.request();
//        request.setExpectMultipart(true);
//        request.endHandler(req->{
//            MultiMap map = routingContext.request().formAttributes();
//            dealCallBackUjoy(routingContext, map);
//        });
//    }
//
//    /***
//     * 处理Ujoy回调
//     */
//    private static void dealCallBackUjoy(RoutingContext routingContext, MultiMap map) {
//        try{
//            Map<String, String> params = new HashMap<String, String>();
//            Iterator<Entry<String, String>> it = map.iterator();
//            JsonObject obj = new JsonObject();
//            while (it.hasNext()) {
//                Entry<String, String> entry = it.next();
//                String key = entry.getKey();
//                String value = entry.getValue();
//                if (value == null) {
//                    value = "";
//                }
//                params.put(key, value);
//                obj.put(key, value);
//            }
//            String str = obj.toString();
//            logger.info("### onReceive path:" + routingContext.request().path() + " params:" + str);
//
//            // 如果是沙盒充值，则屏蔽掉
//            if (ServerParam.UJOY_SANDBOX_PAY == 0 && MainVerticle.isOnlineServer() && params.containsKey("isSandBox")){
//                String isSandBox = params.get("isSandBox");
//                if (isSandBox.equals("1")){
//                    logger.error("isSandBox onReceive path:" + routingContext.request().path() + " params:" + str);
//                    routingContext.response().end(new JsonObject().put("code", "1").toString());// 验证失败
//                    return;
//                }
//            }
//
//            //获取透传参数
//            String passbackParams = params.get("extra");
//            String tmp[] = passbackParams.split("_");
//            long userId = Long.parseLong(tmp[0]);
//            int platform = Integer.parseInt(tmp[1]);
//            int iapGiftId = Integer.parseInt(tmp[2]);
//            String webid = String.valueOf(ServerParam.MOTU_WEBID);
////            String webid = tmp[3];
////            int gameid = Integer.parseInt(tmp[4]);
//            String packageName = tmp[5];
//            String orderId = params.get("gameOrderId");//CP订单号
//
//            // 地下城回调的productId等于iapid
//            IapGift iapGift = LoginIapManager.getIapGift(iapGiftId);
//            if (iapGift == null) {
//                logger.error("path:" + routingContext.request().path() + "iapGift is null orderid = " + orderId + " iapGiftId:" + iapGiftId);
//                routingContext.response().end(new JsonObject().put("code", "1").toString());// 验证失败
//                return;
//            }
//            if (iapGift.getIapId() != Integer.parseInt(params.get("productId"))){
//                logger.error("path:" + routingContext.request().path() + "product error orderid = " + orderId + " params:" + str);
//                routingContext.response().end(new JsonObject().put("code", "1").toString());// 验证失败
//                return;
//            }
//
//            String paykey = new JsonObject(ServerParam.GAME_SECRET_PAY_KEY_UJOY).getString(packageName);
//            params.remove("signature");
//            String content = Tool.getSignCheckContent(params, false);
//            String postSign = map.get("signature");
//            String checkSign = Tool.md5encrypt32(content + "&" + paykey).toUpperCase();
//
//            logger.info("path:" + routingContext.request().path() + " orderid = " + orderId + " packageName = " + packageName + " paykey:" + paykey
//                    + " content:" + content + " postSign:" + postSign + " checkSign:" + checkSign);
//
//            if (postSign.equalsIgnoreCase(checkSign)) {//验证成功
//                double money = Double.parseDouble(params.get("price"));//充值金额（美分）
//                String transInfo = params.get("orderId");//游戏平台订单号
//
//                routingContext.response().end(new JsonObject().put("code", "0").toString());// 成功
//
//                logger.info("path:" + routingContext.request().path() + " success orderid = " + orderId + " userid:" + userId + " platform:" + platform + " iapGiftId:" + iapGiftId + " money:" + money);
//
//                //充值验证成功写入kafka队列
//                pushToQueue(webid, userId, platform, iapGiftId, money, orderId, "", transInfo, str, transInfo, PayTypeEnum.UJOY.value);
//
//            } else {//验证失败
//                logger.error("path:" + routingContext.request().path() + "verify_result fail orderid = " + orderId + " postSign:" + postSign + " checkSign:" + checkSign);
//                routingContext.response().end(new JsonObject().put("code", "1").toString());// 签名校验失败
//            }
//        }catch (Exception e){
//            logger.info("### onReceive path:" + routingContext.request().path() + " exception:" + Tool.getException(e));
//            routingContext.response().end(new JsonObject().put("code", "1").toString());// 验证失败
//        }
//    }

    // 充值成功写入队列
    public static void pushToQueue(String webid, long userId, int platform, int iapid, double money, String orderId, String productId, String transInfo, String callback, String transaction_id, String payType) {
        String topicName = "sdk_pay_" + webid;
        JsonObject obj = new JsonObject();
        obj.put("userid", userId);
        obj.put("platform", platform);
        obj.put("iapid", iapid);
        obj.put("money", money);
        obj.put("orderid", orderId);
        obj.put("productid", productId);
        obj.put("transinfo", transInfo);
        obj.put("callback", callback);
        obj.put("transaction_id", transaction_id);
        obj.put("paytype", payType);
        KafkaProducerRecord<String, String> record = KafkaProducerRecord.create(topicName, obj.toString());
        producer.send(record, done -> {
            if (done.failed()) {
                logger.error("charge send error topicName:" + topicName + " obj:" + obj.toString());
                logger.error("charge send error cause = " + Tool.getException(done.cause()));
            } else {
                logger.info("charge send success topicName:" + topicName + " obj:" + obj.toString());
//            	 RecordMetadata recordMetadata = done.result();
//            	logger.info("charge pushDBQueue Message " + record.value().toString() + " written on topic=" + recordMetadata.getTopic() +
//                        ", partition=" + recordMetadata.getPartition() +
//                        ", offset=" + recordMetadata.getOffset());
            }
        });
    }

}
